package simulateurs.model.monde;

import java.util.ArrayList;

/**
 *
 * @author Jah
 */
public class StringPointIndiceligneconditions {
    
    protected String eventAction;
    protected Point position;
    protected int indiceProchainEtat;
    
    // constructeurs
    
    public StringPointIndiceligneconditions()
    {
    }
    
      public StringPointIndiceligneconditions(String eventAction,Point position, int indiceLigneConditions)
    {
        setEventAction(eventAction);
        setPosition(position);
        setIndiceProchainEtat(indiceLigneConditions);
        
    }
    
    public StringPointIndiceligneconditions(String eventAction,Point position)
    {
        setEventAction(eventAction);
        setPosition(position);
    }
    
    public StringPointIndiceligneconditions(String eventAction)
    {
        setEventAction(eventAction); // Position non initialisée
    }
    
    
    public String getEventAction() {
        return eventAction;
    }
    
    public void setEventAction(String eventAction) {
        this.eventAction = eventAction;
    }
    
    public Point getPosition() {
        return position;
    }
    
    public void setPosition(Point position) {
        this.position = position;
    }

    public int getIndiceProchainEtat() {
        return indiceProchainEtat;
    }

    public void setIndiceProchainEtat(int indiceProchainEtat) {
        this.indiceProchainEtat = indiceProchainEtat;
    }


    
    
    
    // ajout d'un methode de classe pout trier une liste de StringPoint
    // ajout d'une methode de trie selon la distance du point par rapport à celui du robot
    public static void tri_bulles(ArrayList<StringPoint> eventList, Point pointRobot)
    {
        // tab indique this.getPosition()
        boolean tab_en_ordre = false;
        int taille = eventList.size();
        StringPoint tmp;
        while(!tab_en_ordre)
        {
            tab_en_ordre = true;
            for(int i=0 ; i < taille-1 ; i++)
            {
                if(Point.distance(eventList.get(i).getPosition(), pointRobot) > Point.distance(eventList.get(i+1).getPosition(), pointRobot))
                {
                    //swap(tab[i],tab[i+1]);
                    tmp = new StringPoint(eventList.get(i).getEventAction(),eventList.get(i).getPosition());
                    eventList.set(i, new StringPoint(eventList.get(i+1).getEventAction(),eventList.get(i+1).getPosition()));
                    eventList.set(i+1,tmp);
                    tab_en_ordre = false;
                }
            }
            taille--;
        }
    }

    
    // on a besoin :
    
    
    
    public static StringPointIndiceligneconditions selectBetterEvent(ArrayList<StringPointIndiceligneconditions> eventPointIndiceList){
        StringPointIndiceligneconditions eventPointIndex = null;
        int valTimer = 6;
        int valIHaveABalle = 5;
        int valBalle = 5;
        int valRe = 3; // differencier REavecBalle et REsansBalle
        int valMur = 2;
        int valConditionFalseVerifiee = 1;
        int valeurCourante = 0;
        String actionCourant;
        
        
        
        
        for(int i = 0;i<eventPointIndiceList.size();i++){
            actionCourant = eventPointIndiceList.get(i).getEventAction();
            if(actionCourant.compareTo("mur") == 0){
                if (valMur > valeurCourante){
                    valeurCourante=valMur;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("valconditionfalseverifiee") == 0){
                if (valConditionFalseVerifiee > valeurCourante){
                    valeurCourante=valConditionFalseVerifiee;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("re") == 0){
                if (valRe > valeurCourante){
                    valeurCourante=valRe;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("balle") == 0){
                if (valBalle > valeurCourante){
                    valeurCourante=valBalle;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("ihaveaball") == 0){
                if (valIHaveABalle > valeurCourante){
                    valeurCourante=valIHaveABalle;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("timer") == 0){
                if (valTimer > valeurCourante){
                    valeurCourante=valTimer;
                    eventPointIndex = new StringPointIndiceligneconditions(actionCourant,eventPointIndiceList.get(i).getPosition(),eventPointIndiceList.get(i).getIndiceProchainEtat());
                }
            }
        }
        return eventPointIndex;
    }
    
   
    
    
    public static StringPointIndiceligneconditions selectBetterAction(ArrayList<StringPointIndiceligneconditions> actionPointIndexList){
        StringPointIndiceligneconditions actionPointIndex = null;
        int valSeDirigerVersBut = 5;
        int valSeDirigerVersBalle = 4;
        int valAttaquer = 3;
        int valTourner = 2;
        int valAvancer = 1;
        int valeurCourante = 0;
        String actionCourant;
        
        for(int i = 0;i<actionPointIndexList.size();i++){
            actionCourant = actionPointIndexList.get(i).getEventAction();
            if(actionCourant.compareTo("avancer") == 0){
                if (valAvancer > valeurCourante){
                    valeurCourante=valAvancer;
                    actionPointIndex = new StringPointIndiceligneconditions(actionCourant,actionPointIndexList.get(i).getPosition(),actionPointIndexList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("tourner") == 0){
                if (valTourner > valeurCourante){
                    valeurCourante=valTourner;
                    actionPointIndex = new StringPointIndiceligneconditions(actionCourant,actionPointIndexList.get(i).getPosition(),actionPointIndexList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("attaquer") == 0){
                if (valAttaquer > valeurCourante){
                    valeurCourante=valAttaquer;
                    actionPointIndex = new StringPointIndiceligneconditions(actionCourant,actionPointIndexList.get(i).getPosition(),actionPointIndexList.get(i).getIndiceProchainEtat());
                }
            }
            if(actionCourant.compareTo("sedirigerversballe") == 0){
                if (valSeDirigerVersBalle > valeurCourante){
                    valeurCourante=valSeDirigerVersBalle;
                    actionPointIndex = new StringPointIndiceligneconditions(actionCourant,actionPointIndexList.get(i).getPosition(),actionPointIndexList.get(i).getIndiceProchainEtat());
                }
            }
             if(actionCourant.compareTo("sedirigerversbut") == 0){
                if (valSeDirigerVersBut > valeurCourante){
                    valeurCourante=valSeDirigerVersBut;
                    actionPointIndex = new StringPointIndiceligneconditions(actionCourant,actionPointIndexList.get(i).getPosition(),actionPointIndexList.get(i).getIndiceProchainEtat());
                }
            }
            
        }
        
        
        
        
        return actionPointIndex;
    }
}


